# Vinteo

Произведен анализ упаковки программного обеспечения "Vinteo" в RPM.

## Объект тестирования

* имя файла: `Vinteo.Desktop-3.13.0-x86_64.rpm`
* хеш MD5: `637e062c0234258775482fcd611e63cf`

## Анализ пакета

### Скриптлеты пакеты

В пакете следующие скриптлеты:

```
$ rpm -qp Vinteo.Desktop-3.13.0-x86_64.rpm --scripts
postinstall scriptlet (using /bin/sh):
#!/bin/bash

if type update-alternatives 2>/dev/null >&1; then
    # Remove previous link if it doesn't use update-alternatives
    if [ -L '/usr/bin/vinteo.desktop' -a -e '/usr/bin/vinteo.desktop' -a "`readlink '/usr/bin/vinteo.desktop'`" != '/etc/alternatives/vinteo.desktop' ]; then
      rm -f '/usr/bin/vinteo.desktop'
    fi
    update-alternatives --install '/usr/bin/vinteo.desktop' 'vinteo.desktop' '/opt/VinteoDesktop/vinteo.desktop' 100
else
    ln -sf '/opt/VinteoDesktop/vinteo.desktop' '/usr/bin/vinteo.desktop'
fi

# SUID chrome-sandbox for Electron 5+
chmod 4755 '/opt/VinteoDesktop/chrome-sandbox' || true

update-mime-database /usr/share/mime || true
update-desktop-database /usr/share/applications || true
postuninstall scriptlet (using /bin/sh):
#!/bin/bash

# Delete the link to the binary
if type update-alternatives >/dev/null 2>&1; then
    update-alternatives --remove 'vinteo.desktop' '/usr/bin/vinteo.desktop'
else
    rm -f '/usr/bin/vinteo.desktop'
fi
```

postinstall выполняется после установки пакета, а postuninstall после удаления пакета. При обновлении пакета в одной транзакции ставится новый пакет и удаляется старый. Сначала будет выполнен `%post` нового пакета (будет создан симлинк), а затем будет выполнен `%postun` старого пакета (симлинк будет удален). Первым аргументом скриптлету приходит количество пакетов, остающихся после транзакции, что позволяет определить, обновление это или полное удаление. Подробно описано здесь: [https://docs.fedoraproject.org/en-US/packaging-guidelines/Scriptlets/](https://docs.fedoraproject.org/en-US/packaging-guidelines/Scriptlets/). Обратите внимание на раздел "Ordering".

Однако при установке такого пакета поверх старой версии все равно сработает `%postun` старой версии и удалит симлинк, созданный в процессе установки предыдущей версии пакета. Объехать это можно, прописав в новой версии, где симлинк уже входит в файлы пакета, так:

```
%triggerpostun -- %{name} < новая_версия
<...>
```

Не очень понятна необходимость создавать симлинк скриптом, его можно добавить прямо в RPM. Возможно, заложена возможность иметь одновременно установленными стабильную, бета и т.д. версии Vinteo? Если в симлинке нет необходимости, то лучше, чтобы не создавались файлы и симлинки в обход пакетной системы.

#### Изменение режима доступа к файлу в обход пакетного менеджера

Устанавливать SUID на `/opt/VinteoDesktop/chrome-sandbox` скриптом можно, но не стоит. Поставить права 4755 можно внутри секции `%install` спека и/или исползуя `%attr` в `%files`:

`%attr(4755,-,-) "/opt/VinteoDesktop/chrome-sandbox"`

В rpm существует функционл проверки целостности пакета (`rpm -V`), он будет выдавать, что права на файл не целостны, если менять их скриптом.

Для deb-пакета придется оставить скрипт.

#### Излишние команды в скриптлете

В пакете есть файл `/usr/share/applications/*.desktop`, вызывать `update-desktop-database /usr/share/applications` действительно нужно, однако пакетная система каждого RPM-дистрибутива уже делает это самостоятельно, при чем не только при установке пакета, но и при его удалении.

Это реализуется с помощью файловых триггеров. Примеры:

0. в MOS 12 / ROSA Fresh/Chrome:
	0. [https://abf.io/import/desktop-file-utils/blob/7cd08b7a71/desktop-file-utils.spec#lc-38](https://abf.io/import/desktop-file-utils/blob/7cd08b7a71/desktop-file-utils.spec#lc-38)
	0. [https://abf.io/import/shared-mime-info/blob/d4087491b6/shared-mime-info.spec#lc-72](https://abf.io/import/shared-mime-info/blob/d4087491b6/shared-mime-info.spec#lc-72)
0. в ALT Linux:
	0. [https://packages.altlinux.org/ru/sisyphus/srpms/desktop-file-utils/specfiles/#line-73](https://packages.altlinux.org/ru/sisyphus/srpms/desktop-file-utils/specfiles/#line-73)
	0. [https://packages.altlinux.org/ru/sisyphus/srpms/shared-mime-info/specfiles/](https://packages.altlinux.org/ru/sisyphus/srpms/shared-mime-info/specfiles/) (см. filetrigger)

Файлов, из-за которых было бы необходимо вызывать `update-mime-database`, в пакете нет. Рекомендую убрать вызовы и `update-mime-database`, и `update-desktop-database`, пакетные системы дистрибутивы сделают это сами, когда нужно.

Обратите внимание, что в deb-пакетах нужные скриптлеты могут добавляться в пакет автоматически при его сборке.

### Содержимое пакета

#### Ничейные каталоги

Корень директории `/opt/VinteoDesktop` не принадлежит пакету. Если его установить и выполнить команду `rpm -qf /opt/VinteoDesktop`, то будет написано, что каталог ничейный. То же самое касается других каталогов. Пропишите в `%files`:

```
%dir /opt/VinteoDesktop
%dir /opt/VinteoDesktop/locales
%dir /opt/VinteoDesktop/resources
%dir /opt/VinteoDesktop/swiftshader
```

Или можно просто прописать в `%files` основную директорию со всем содержимым:

```
%files
/opt/VinteoDesktop
...
```

Бинарный файл `/opt/VinteoDesktop/vinteo.desktop` вводит в заблужение, т.к. *.desktop - это файлы, "ярлыков" приложений. Даже Dolphin начинает тормозить, когда встречает такой файл просто в открытой папке и пытается его обработать. Предвидятся серьёзные проблемы с совместимостью. Рекомендуется назвать бинарный файл `vinteo-desktop` и хорошо бы создать для него симлинк в `/usr/bin`, чтобы можно было нормально запустить из командной строки.

Судя по тому, что проблемы типовые с другими приложениями на Electron, рекомендуем собирать пакет через rpm-build напрямую, а не через Electron.

#### Лишняя debug-информация

В пакете присутствуют каталог `/usr/lib/.build-id` и файлы в нем, это не имеет смысла. Рекомендуем выставить макрос `%_build_id_links` в значение `alldebug` (https://github.com/rpm-software-management/rpm/blob/56558a5a6/macros.in#L498).

### Зависимости пакета

У пакета следующие зависимости:

```
$ rpm -qR Vinteo.Desktop-3.13.0-x86_64.rpm
/bin/sh
/bin/sh
at-spi2-core
gtk3
libXScrnSaver
libXtst
libnotify
libuuid
nss
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
xdg-utils
```

Чтобы пакет был дистрибутивоуниверсальным, рекомендуем заменить зависимости на следующий вид: `libfoo.so.N()(64bit)`. RPM может проставить такие зависимости автоматически, если не отключать AutoReq.  Рекомендуем ознакомиться с материалом: https://nixtux.ru/1268

Вариант указания зависимостей:

```
Requires:	at-spi2-core
Requires:	nss
Requires:	xdg-utils
Requires:	libgtk-3.so.0()(64bit)
Requires:	libXss.so.1()(64bit)
Requires:	libXtst.so.6()(64bit)
Requires:	libnotify.so.4()(64bit)
Requires:	libuuid.so.1()(64bit)
```

Я ещё проверил бинарник на библиотеках из списка и обнаружил, что `libXss`, `libXtst.so` и `libuuid.so.1` не используются. Может они не этим бинарником используются? Они точно нужны в проекте? А остальные я смог найти, значит и RPM их сможет найти автоматом и нет необходимости их указывать в зависимостях.

```
$ strings vinteo.desktop | grep -i 'libgtk-3.so'
libgtk-3.so.0
libgtk-3.so.0
$ strings vinteo.desktop | grep -i 'libXss.so'
Пусто
$ strings vinteo.desktop | grep -i 'libXtst.so'
Пусто
$ strings vinteo.desktop | grep -i 'libnotify.so.4'
libnotify.so.4
$ strings vinteo.desktop | grep -i 'libuuid.so.1'
Пусто
```


## Информация о пакете

```
$ rpm -qi Vinteo.Desktop-3.15.0-x86_64.rpm
Name        : Vinteo.Desktop
Version     : 3.15.0
Release     : 42128
Architecture: x86_64
Install Date: (not installed)
Group       : default
Size        : 283611910
License     : unknown
Signature   : (none)
Source RPM  : Vinteo.Desktop-3.15.0-42128.src.rpm
Build Date  : Вт 07 ноя 2023 17:37:33
Build Host  : runner-lfnpu9r-project-92-concurrent-0
Relocations : / 
Packager    : VINTEO OOO <support@vinteo.ru>
Vendor      : VINTEO OOO <support@vinteo.ru>
URL         : https://vinteo.com
Summary     : Client for Vinteo videoconferencing server
Description :
Client for Vinteo videoconferencing server
```


Не указана лицензия, описание и группа. Чтобы в пакетном менеджере пакет был отображён не отдельно непонятно где, следует указать группу к которой относится утилита. Стандартные группы собраны, например, тут: http://wiki.rosalab.ru/en/index.php/Packaging_group

Имя пакета Vinteo.Desktop очень нестандартное для любого дистрибутива. Основным именем очень рекомендуем сделать `vinteo-desktop`. Это будет соостветствовать стандартным именованиям.

Summary и Description было бы здорово дублировать на русском языке.

```
...

Summary(ru_RU.UTF-8): 
...
%description -l ru_RU.UTF-8
...
```

Пример:

https://hub.mos.ru/mos/pkgs/mos-docdir/-/blob/main/mos-docdir.spec
